package leetcode.l0608;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Retain
 * @date 2021/6/8 15:21
 */
public class Medium_字母异位词分组_49 {
    public static void main(String[] args) {
        HashMap<String,List<String>> strings = new HashMap<>();
    }

    /**
     * 使用map存放，key为统一排序后的字符串，value为list，即排序前的字符串
     * @param strs
     * @return
     */
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String,List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            // 如果存在则拿到，没有创建默认
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);

        }
        return new ArrayList<>(map.values());
    }

    /**
     * 利用stream
     * @param strs
     * @return
     */
    public List<List<String>> groupAnagrams2(String[] strs) {
        return new ArrayList<>(Arrays.stream(strs)
                .collect(Collectors.groupingBy(str -> {
                    // 返回 str 排序后的结果。
                    // 按排序后的结果来grouping by，算子类似于 sql 里的 group by。
                    char[] array = str.toCharArray();
                    Arrays.sort(array);
                    return new String(array);
                })).values());
    }

    /**
     * 计数法，同样利用map，key不用排序，如[b,a,a,a,b,c] 编码成 a3b2c1作为key
     * @param strs
     * @return
     */
    public List<List<String>> groupAnagrams3(String[] strs) {
        return new ArrayList<>(Arrays.stream(strs)
                .collect(Collectors.groupingBy(str -> {
                    int[] counter = new int[26];
                    for (int i = 0; i < str.length(); i++) {
                        counter[str.charAt(i) - 'a']++;
                    }
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < 26; i++) {
                        // 这里的 if 是可省略的，但是加上 if 以后，生成的 sb 更短，后续 groupingBy 会更快。
                        if (counter[i] != 0) {
                            sb.append((char) ('a' + i));
                            sb.append(counter[i]);
                        }
                    }
                    return sb.toString();
                })).values());
    }


}
